// 定义一个白名单，表示不需要登录校验的请求
const whiteList = ['/login', '/register'];
// token 校验函数
const { checkToken } = require('../utility');
// 导出一个函数，返回一个中间件
module.exports = () => {
    // 返回中间件
    return async (ctx, next) => {
        // 如果是白名单中的请求，就不在校验登录了
        if (whiteList.includes(ctx.path)) {
            // 在白名单内的请求不需要校验 token
            await next();
        } else {
            // 从请求 header 中，获取前端传入的 token 值，这个是登录接口成功后，返回的 token
            const token = ctx.headers.token;
            // 校验 token 的合法性
            // 如果 token 不合法，返回 false，如果 token 合法，返回生成 token 时，保存的用户信息
            const user = checkToken(token);
            // console.log(user);
            if (!user) {
                ctx.body = {
                    code: 401,
                    message: 'token 无效',
                };
                return;
            }
            // 走到这里，说明 token 是有效的，并且能够解析出 user 的信息
            // 这里挂载到 ctx 这个上下文对象上，为了在路由方法中使用这个登录用户的信息
            ctx.user = user;
            // 身份校验中间件校验成功，向下执行
            await next();
        }
    };
};
